উন্নয়ন এবং উৎপাদন পরিবেশের মধ্যে পার্থক্য
এই পৃষ্ঠাটি Node.js অ্যাপ্লিকেশনগুলিতে উন্নয়ন এবং উত্পাদন পরিবেশের মধ্যে মূল পার্থক্যগুলিকে কভার করে এবং উভয়কেই কার্যকরভাবে পরিচালনা করার জন্য সর্বোত্তম অনুশীলন প্রদান করে৷
এক নজরে মূল পার্থক্য
উন্নয়ন
- বিস্তারিত রেকর্ড
- বিস্তারিত ত্রুটি বার্তা
- হট-রিলোডিং সক্ষম করা হয়েছে৷
- অপরিবর্তিত কোড
- উপহাস তথ্য/স্টাব
উৎপাদন
- ন্যূনতম নিবন্ধন
- সাধারণ ত্রুটি বার্তা
- উন্নত কর্মক্ষমতা
- সংক্ষিপ্ত এবং সংকলিত কোড
- প্রকৃত তথ্য/পরিষেবা
NODE_ENV পরিবেশ পরিবর্তনশীল
Node.js , NODE_ENV .
এটি সাধারণত 'উন্নয়ন' বা 'উৎপাদন'-এ সেট করা হয়, যদিও অন্যান্য মান যেমন 'পরীক্ষা' বা 'মঞ্চায়ন' ব্যবহার করা হয়।
দ্রষ্টব্য:
অনেক Node.js ফ্রেমওয়ার্ক এবং লাইব্রেরি (এক্সপ্রেস, রিঅ্যাক্ট, ভিউ, ইত্যাদি) নির্দিষ্ট বৈশিষ্ট্য এবং বর্ধনগুলি সক্ষম বা অক্ষম করতে NODE_ENV ব্যবহার করে।
NODE_ENV সেট করা হচ্ছে
কমান্ড লাইন
# Windows Command Prompt
set NODE_ENV=production
node app.js
# Windows PowerShell
$env:NODE_ENV="production"
node app.js
# Linux/macOS
export NODE_ENV=production
node app.js
package.json
{
"scripts": {
"start": "NODE_ENV=production node app.js",
"dev": "NODE_ENV=development nodemon app.js",
"test": "NODE_ENV=test jest"
}
}
ক্রস-এনভি ব্যবহার করা (ক্রস-প্ল্যাটফর্ম)
npm install --save-dev cross-env
{
"scripts": {
"start": "cross-env NODE_ENV=production node app.js"
}
}
আপনার অ্যাপ্লিকেশনে NODE_ENV ব্যবহার করা হচ্ছে
// Simple environment check
const isProduction = process.env.NODE_ENV === 'production';
const isDevelopment = !isProduction;
// Environment-specific configuration
const config = {
port: process.env.PORT || 3000,
db: {
host: isProduction ? 'prod-db.example.com' : 'localhost',
name: isProduction ? 'myapp_prod' : 'myapp_dev'
},
logging: {
level: isProduction ? 'warn' : 'debug',
prettyPrint: !isProduction
}
};
// Express.js example
const express = require('express');
const app = express();
কর্মক্ষমতা উন্নতি:
NODE_ENV=উৎপাদন সেট করা 35% পর্যন্ত অ্যাপ্লিকেশন কর্মক্ষমতা উন্নত করতে পারে, কারণ কিছু প্যাকেজ এই সেটিং এর উপর ভিত্তি করে বর্ধিতকরণ ব্যবহার করে।
স্ট্রাকচার ম্যানেজমেন্ট
বিভিন্ন পরিবেশে ডাটাবেস, API, লগিং এবং অন্যান্য পরিষেবার জন্য সাধারণত বিভিন্ন আর্কিটেকচারের প্রয়োজন হয়।
প্রসঙ্গ-নির্দিষ্ট কনফিগারেশন
// Install dotenv: npm install dotenv
require('dotenv').config(); // Loads .env file contents into process.env
// config.js
module.exports = {
development: {
port: 8080,
database: 'mongodb://localhost:27017/myapp_dev',
logLevel: 'debug',
apiKeys: {
thirdPartyService: process.env.DEV_API_KEY
}
},
test: {
port: 3001,
database: 'mongodb://localhost:27017/myapp_test',
logLevel: 'info',
apiKeys: {
thirdPartyService: process.env.TEST_API_KEY
}
},
production: {
port: process.env.PORT || 8080,
database: process.env.DATABASE_URL,
logLevel: 'error',
apiKeys: {
thirdPartyService: process.env.PROD_API_KEY
}
}
};
const env = process.env.NODE_ENV || 'development';
module.exports.current = module.exports[env];
কনফিগারেশন ফাইল
কাঠামো ব্যবস্থাপনার সাধারণ পদ্ধতি:
নিরাপত্তা সতর্কতা:
সংবেদনশীল তথ্য যেমন API কী, ডাটাবেস শংসাপত্র বা গোপনীয়তা সংস্করণ নিয়ন্ত্রণে জমা দেবেন না। সংবেদনশীল ডেটার জন্য সর্বদা পরিবেশ ভেরিয়েবল বা সুরক্ষিত কনফিগারেশন পরিষেবাগুলি ব্যবহার করুন৷
ত্রুটি হ্যান্ডলিং
ত্রুটি পরিচালনার কৌশলগুলি উন্নয়ন এবং উত্পাদন পরিবেশের মধ্যে পৃথক হওয়া উচিত:
উন্নয়ন পরিবেশ
- বিস্তারিত ত্রুটি বার্তা এবং স্ট্যাক ট্রেস দেখান
- ডিবাগিং করতে সাহায্য করার জন্য বিস্তারিত লগিং ব্যবহার করুন
- ত্রুটি দ্রুত ক্র্যাশ
- ভাল ডিবাকলিং এর জন্য উৎস মানচিত্র সক্ষম করুন
- ইন্টারেক্টিভ ডিবাগিং টুল প্রদান করুন
উৎপাদন পরিবেশ
- ত্রুটি প্রতিক্রিয়া থেকে বাস্তবায়ন বিবরণ লুকান
- অভ্যন্তরীণ ব্যবহারের জন্য ত্রুটিগুলি লগ করুন তবে জেনেরিক ত্রুটি বার্তাগুলি ফেরত দিন৷
- সঠিক ত্রুটি পুনরুদ্ধার প্রক্রিয়া বাস্তবায়ন
- ভাল বিশ্লেষণের জন্য কাঠামোগত লগিং ব্যবহার করুন
- বাহ্যিক পরিষেবাগুলির জন্য সার্কিট ব্রেকার সক্রিয় করুন
প্রসঙ্গ-নির্দিষ্ট ত্রুটি পরিচালনা
const express = require('express');
const app = express();
app.get('/api/data', (req, res) => {
try {
// Some operation that might fail
throw new Error('Something went wrong');
} catch (error) {
// Log the error internally (always do this)
console.error('Error occurred:', error);
// Provide different responses based on environment
if (process.env.NODE_ENV === 'production') {
// In production: generic error message
return res.status(500).json({
error: 'An unexpected error occurred'
});
} else {
// In development: detailed error information
return res.status(500).json({
error: error.message,
stack: error.stack,
details: 'This detailed error is only shown in development'
});
}
}
});
app.listen(8080);
নিবন্ধন কৌশল
নিবন্ধন প্রয়োজনীয়তা উন্নয়ন এবং উত্পাদন মধ্যে উল্লেখযোগ্যভাবে পার্থক্য:
উন্নয়ন রেজিস্টার
- বিস্তারিত তথ্য সহ বিস্তারিত রেকর্ড
- রঙ সহ মানব-পাঠযোগ্য বিন্যাস
- তাত্ক্ষণিক প্রতিক্রিয়ার জন্য কনসোল আউটপুট
- ডিবাগ এবং ট্রেস স্ট্যাটাস লগিং সক্ষম করা হয়েছে
- কোন নিবন্ধন চক্র প্রয়োজন
উৎপাদন নিবন্ধন
- স্ট্রাকচার্ড লগ (JSON ফর্ম্যাট)
- উপযুক্ত লগিং অবস্থা (সতর্ক/ত্রুটি)
- নিবন্ধন চক্র এবং ধরে রাখার নীতি
- কেন্দ্রীভূত নিবন্ধন একীকরণ
- কর্মক্ষমতা পর্যবেক্ষণ ইন্টিগ্রেশন
উইনস্টনের সাথে প্রসঙ্গ-নির্দিষ্ট রেকর্ডিং
const winston = require('winston');
// Define different logging configurations per environment
const logger = winston.createLogger({
level: process.env.NODE_ENV === 'production' ? 'info' : 'debug',
format: process.env.NODE_ENV === 'production'
? winston.format.json()
: winston.format.combine(
winston.format.colorize(),
winston.format.simple()
),
defaultMeta: { service: 'user-service' },
transports: [
// Always log errors to a file
new winston.transports.File({
filename: 'error.log',
level: 'error'
}),
// In production, save all logs to a file
...(process.env.NODE_ENV === 'production'
? [new winston.transports.File({ filename: 'combined.log' })]
: []),
// In development, log to the console
...(process.env.NODE_ENV !== 'production'
? [new winston.transports.Console()]
: [])
],
});
logger.info('Application started');
logger.debug('This debug message appears only in development');
কর্মক্ষমতা উন্নতি
উত্পাদন পরিবেশগুলি কর্মক্ষমতা এবং নির্ভরযোগ্যতার জন্য অপ্টিমাইজ করা উচিত:
উন্নয়ন ফোকাস
- দ্রুত আপডেট এবং গরম মডিউল প্রতিস্থাপন
- debuckling জন্য উৎস মানচিত্র
- বিস্তারিত ত্রুটি ওভারলে
- অপরিবর্তিত কোড
- উন্নয়ন সরঞ্জাম একীকরণ
উৎপাদনশীলতার উন্নতি
- সূচক হ্রাস এবং গাছ-কাঁপানো
- সম্পত্তি উন্নয়ন এবং কম্প্যাকশন
- কন্টেন্ট ডেলিভারি নেটওয়ার্ক (CDN) অ্যাপ্লিকেশন
- ব্রাউজার ক্যাশে হেডার
- কর্মক্ষমতা নিরীক্ষণ
উৎপাদনে ক্লাস্টার মোডে চলছে
const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;
if (process.env.NODE_ENV === 'production' && cluster.isMaster) {
console.log(`Master ${process.pid} is running`);
// Fork workers
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`Worker ${worker.process.pid} died`);
// Replace the dead worker
cluster.fork();
});
} else {
// Workers can share a TCP connection
http.createServer((req, res) => {
res.writeHead(200);
res.end('Hello World\n');
}).listen(8000);
console.log(`Worker ${process.pid} started`);
}
নিরাপত্তা বিবেচনা
উত্পাদন পরিবেশে সুরক্ষা অনুশীলনগুলি আরও কঠোর হওয়া উচিত:
পণ্য নিরাপত্তা ব্যবস্থা
উৎপাদনের জন্য নিরাপত্তা মিডলওয়্যার
const express = require('express');
const helmet = require('helmet');
const rateLimit = require('express-rate-limit');
const app = express();
// Apply security middleware in production
if (process.env.NODE_ENV === 'production') {
// Set security headers
app.use(helmet());
// Enable rate limiting
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 minutes
max: 100, // limit each IP to 100 requests per windowMs
message: 'Too many requests from this IP, please try again later'
});
app.use('/api/', limiter);
// Force HTTPS
app.use((req, res, next) => {
if (req.header('x-forwarded-proto') !== 'https') {
res.redirect(`https://${req.header('host')}${req.url}`);
} else {
next();
}
});
}
app.get('/', (req, res) => {
res.send('Hello World');
});
app.listen(8080);
কাঠামোগত প্রক্রিয়া
TypeScript, Babel, বা অন্যান্য ফ্রেমওয়ার্ক টুল ব্যবহার করে এমন অ্যাপ্লিকেশনগুলির জন্য, কনফিগারেশন প্রক্রিয়া পরিবেশের মধ্যে আলাদা হয়:
উন্নয়ন কাঠামো
- debuckling জন্য উৎস মানচিত্র
- ক্রমাগত সংগ্রহ
- হট ব্লক প্রতিস্থাপন
- কম আক্রমণাত্মক উন্নতি
উত্পাদন কাঠামো
- ছাঁটাই এবং গাছ কাঁপানো
- সমষ্টি এবং সূচক পৃথকীকরণ
- প্রিপ্যাকেজড
- কোন উৎস মানচিত্র (বা বহিরাগত উৎস মানচিত্র)
বিভিন্ন পরিবেশের জন্য webpack.config.js
const path = require('path');
const TerserPlugin = require('terser-webpack-plugin');
module.exports = (env, argv) => {
const isProduction = argv.mode === 'production';
return {
entry: './src/index.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: isProduction
? 'bundle.[contenthash].js'
: 'bundle.js'
},
mode: isProduction ? 'production' : 'development',
// Generate source maps in development but not production
devtool: isProduction ? false : 'eval-source-map',
optimization: {
minimize: isProduction,
minimizer: isProduction ? [
new TerserPlugin({
terserOptions: {
compress: true,
mangle: true
}
})
] : [],
},
// Add development server configuration for non-production
...(isProduction ? {} : {
devServer: {
contentBase: './dist',
hot: true
}
})
};
};
সর্বোত্তম অনুশীলন
বৈশিষ্ট্য পতাকা উদাহরণ
const featureFlags = {
development: {
newUserInterface: true,
experimentalFeature: true,
betaAnalytics: true
},
production: {
newUserInterface: false,
experimentalFeature: false,
betaAnalytics: true
}
};
const env = process.env.NODE_ENV || 'development';
const features = featureFlags[env];
if (features.newUserInterface) {
// Enable the new UI
}
সারাংশ
| মূল পয়েন্ট | ব্যাখ্যা |
|---|---|
| NODE_ENV অ্যাপ্লিকেশন | উন্নয়ন এবং উৎপাদন পরিবেশের মধ্যে পার্থক্য করতে NODE_ENV পরিবেশ পরিবর্তনশীল ব্যবহার করুন |
| স্ট্রাকচার ম্যানেজমেন্ট | প্রসঙ্গ-নির্দিষ্ট কনফিগারেশন পরিচালনা সক্ষম করুন |
| ত্রুটি হ্যান্ডলিং | উন্নয়ন (বিস্তারিত) এবং উৎপাদন (নিরাপদ) এ ত্রুটিগুলিকে ভিন্নভাবে পরিচালনা করুন। |
| নিবন্ধন কৌশল | প্রেক্ষাপটের উপর ভিত্তি করে লগিং কৌশলগুলি সামঞ্জস্য করুন |
| কর্মক্ষমতা এবং নিরাপত্তা | উৎপাদনে দক্ষতার উন্নতি এবং নিরাপত্তা ব্যবস্থা প্রয়োগ করুন |
| গঠন এবং বন্টন | প্রতিটি পরিবেশের জন্য বিভিন্ন কনফিগারেশন এবং বিতরণ প্রক্রিয়া ব্যবহার করুন |